﻿/*****************************************************************//**
 * @file    FITKVAOneXMLHash.h
 * @brief   VAOneXML哈希表类
 *
 * @author  lilongyuan (lilongyuan@diso.cn)
 * @date    2025-02-18
 *********************************************************************/

#ifndef FITKVAONEXMLHASH_H
#define FITKVAONEXMLHASH_H

#include "qhash.h"

namespace VAOne
{
    class FITKVAOneXMLHash
    {
    public:
        /**
         * @brief   节点枚举
         * @author  lilongyuan (lilongyuan@diso.cn)
         * @date    2025-02-18
         */
        enum VAOneXMLNodeType
        {
            Node_None = 0,                     ///< 无效类型
            Node_GlobalFrequencyDomain = 1,    ///< 全局频率
            Node_Nodes = 2,                    ///< 节点
            Node_Spectra = 3,                  ///< 频谱
            Node_Materials = 4,                ///< 材料
            Node_FEMaterials = 5,              ///< FE材料
            Node_PhysicalProperties = 6,       ///< 物理属性
            Node_FEProperties = 7,             ///< FE属性
            Node_NoiseControlTreatments = 8,   ///< 声学包
            Node_Faces = 9,                    ///< 面
            Node_Subsystems = 10,              ///< SEA子系统
            Node_FESubsystems = 11,            ///< FE结构子系统
            Node_Sinks = 12,                   ///< 半无限流体
            Node_PowerSources = 13,            ///< 能量源
            Node_Constraints = 14,             ///< 约束
            Node_Junctions = 15,               ///< 交点/耦合
            Node_Connections = 16,             ///< 连接
            Node_Blobs = 17,                   ///< Blobs节点（预留类型）
            Node_SpeechClarityOptions = 18,    ///< SpeechClarityOptions节点（预留类型）
            Node_BSROptions = 19,              ///< BSROptions节点（预留类型）
            Node_AcousticFESubSystems = 20,    ///< FE腔体子系统
            Node_FESubSystemElementList = 21,  ///< FE子系统单元列表
        };
        /**
         * @brief   构造函数
         * @author  lilongyuan (lilongyuan@diso.cn)
         * @date    2025-02-18
         */
        explicit FITKVAOneXMLHash() = default;
        /**
         * @brief   析构函数
         * @author  lilongyuan (lilongyuan@diso.cn)
         * @date    2025-02-18
         */
        ~FITKVAOneXMLHash() = default;
    public:
        /**
         * @brief     向XML读取哈希表里追加数据
         * @param[i]  nodeType 节点类型，objectName XML里的名称，id 数据结构对应的ID
         * @return    是否执行成功
         * @author    lilongyuan (lilongyuan@diso.cn)
         * @date      2025-02-18
         */
        bool appendKeyValue(VAOneXMLNodeType nodeType, QString objectName, int id);
        /**
         * @brief     向XML读取哈希表里追加数据
         * @param[i]  nodeType 节点类型，objectId XML里的ID，id 数据结构对应的ID
         * @return    是否执行成功
         * @author    lilongyuan (lilongyuan@diso.cn)
         * @date      2025-02-18
         */
        bool appendKeyValue(VAOneXMLNodeType nodeType, int objectId, int id);
        /**
         * @brief     获取XML读取哈希表里存储的数据结构对应的ID
         * @param[i]  nodeType 节点类型，objectName XML里的名称
         * @return    是否执行成功
         * @author    lilongyuan (lilongyuan@diso.cn)
         * @date      2025-02-18
         */
        int getValue(VAOneXMLNodeType nodeType, QString objectName);
        /**
         * @brief     获取XML读取哈希表里存储的数据结构对应的ID
         * @param[i]  nodeType 节点类型，objectId XML里的ID
         * @return    是否执行成功
         * @author    lilongyuan (lilongyuan@diso.cn)
         * @date      2025-02-18
         */
        int getValue(VAOneXMLNodeType nodeType, int objectId);
    private:
        /**
         * @brief   XML读取哈希表，存储XML里唯一标识为名称的
         * @author  lilongyuan (lilongyuan@diso.cn)
         * @date    2025-02-18
         */
        QHash<VAOneXMLNodeType, QHash<QString, int>> _nodeObjectNameHash{};
        /**
         * @brief   XML读取哈希表，存储XML里唯一标识为ID的
         * @author  lilongyuan (lilongyuan@diso.cn)
         * @date    2025-02-18
         */
        QHash<VAOneXMLNodeType, QHash<int, int>> _nodeObjectIdHash{};
    };
}
#endif // FITKVAONEXMLHASH_H

